#include <stdio.h>  
#include <stdlib.h>  
#include <stdbool.h>  

#define ADT int
#define MAX_SIZE 100  
  
struct myLoopQueue
{  
    ADT data[MAX_SIZE];//数据
    int front; //队头指针
    int rear;  //队尾指针
};
typedef struct myLoopQueue LoopQueue;

//初始化循环队列
void initQueue(LoopQueue *q)
{
	//初始化头尾指针为0位置
	q->front = 0;
	q->rear = 0;
}

//判断队列是否为空
bool isEmpty(LoopQueue *q)
{
	//判空条件是头尾指针指向同一个位置
	if(q->front==q->rear)
	{
		return true;
	}
	else
	{
		return false;
	}
} 
  
//判断队列是否已满  
bool isFull(LoopQueue *q)
{
	//判满条件是尾指针指向的下一个位置是头指针的值
	if(((q->rear + 1) % MAX_SIZE) == q->front)
	{
		return true;
	}
	return false;
}

//入队操作
bool enqueue(LoopQueue *q, ADT x)
{
	//对于数组而言，向队列中添加元素，首先要判满
	if (isFull(q))
	{
		printf("Queue is full\n");
		return false;
	}
	//将数据保存到队列中队尾
	q->data[q->rear] = x;
	//修改队尾指针，指向下一个位置，为下一次存储数据做好准备
	q->rear = (q->rear + 1) % MAX_SIZE;
	return true;
}
  
//出队操作  
bool dequeue(LoopQueue *q, ADT* x)
{
	//首先判空
	if (isEmpty(q))
	{
		printf("Queue is empty\n");
		return false;
	}
	//从对头取出数据
	*x = q->data[q->front];
	//修改对头指针，指向下一个位置
	q->front = (q->front + 1) % MAX_SIZE;
	return true;
}

void display(LoopQueue *q)
{
	int i;
	for(i = q->front; i != q->rear; i = ((i + 1) % MAX_SIZE))
	{
		printf("%d\t", q->data[i]);
	}
	printf("\n");
	return;
}
  
int main(int argc, char* argv[])
{
	LoopQueue q;
	initQueue(&q);

	// 入队操作
	enqueue(&q, 1);
	enqueue(&q, 2);
	enqueue(&q, 3);
	display(&q);

	// 出队操作
	ADT x;
	dequeue(&q, &x);
	printf("Dequeued: %d\n", x); // 输出 1
	display(&q);

	return 0;
}
